<?php

namespace app\modules\api\controllers;

use app\models\tableModel\AdminUserModel;
use app\controllers\BaseController;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use app\models\CommonModel;

/**
 * [操作员管理]操作控制器
 * User: Administrator
 * Date: 2020/09/19
 * Time: 10:11:31
*/
class AdminUserController extends BaseController
{

    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [ // 请求方式
                'class' => VerbFilter::className(),
                'actions' => [
                    'list' => ['GET'],
                    'detail' => ['GET'],
                    'create' => ['POST'],
                    'update' => ['POST'],
                    'disabled' => ['POST'],
                    'open' => ['POST'],
                    'sort' => ['POST'],
                    'change-password' => ['POST']
                ],
            ],
            'access' => [ // 是否游客可以访问
                'class' => AccessControl::className(),
                'rules' => [
                    [ // 必须登陆才能访问
                        'actions' => [
                            'list',
                            'detail',
                            'create',
                            'update',
                            'disabled',
                            'open',
                            'sort',
                            'change-password'
                        ],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                    [ // 无需登陆即可访问
                        'actions' => [],
                        'allow' => false,
                        'roles' => ['?']
                    ]
                ]
            ]
        ];
    }

    /**
     * 列表
     * @return mixed
     */
    public function actionList()
    {

        // 查询内容
        $find = $this->get('search');

        // 显示当前第几页
        $page = !$this->get('page') ? 0 : $this->get('page');

        // 每页显示多少条
        $pageSize = (!$this->get('pageSize') || $this->get('pageSize') <= 0 || $this->get('pageSize') > 100) ? \Yii::$app->params['dataLimit'] : $this->get('pageSize');

        // 字段1
        $field = [
            'id',
            'user_name',
            'nick_name',
            'salt',
            'password_hash',
            'status',
            'add_time',
            'update_time',
            'avatar',
            'role_id',
        ];

        // 父级别[model]
        $model = AdminUserModel::loadModel();

        // 数据列表
        $list = $model->loadWhere($find)->getList($page, $pageSize, $field);

        // 总数
        $count = $model->loadWhere($find)->getCount();

        return $this->jsonSuccess('成功', [
            'total' => $count,
            'list' => $list,
            'roleList' => $model->getRoleList()
        ]);
    }

    /**
     * 详情
     * @param string $id 用户编号
     * @return mixed
     */
    public function actionDetail()
    {

        // 获取全部POST数据
        $id = $this->get('id');

        // 验证 规格编号
        if (empty($id)) {

            return $this->jsonFail('数据不存在', 404, [
                'error_hint' => '请传输编号',
                'error_code' => 400
            ]);
        }

        $model = AdminUserModel::loadModel($id);

        if ($model == null) {

            return $this->jsonFail('数据不存在', 404, [
                'error_hint' => '数据不存在，请核对',
                'error_code' => 404
            ]);
        }

        // 仅仅返回指定 字段
        $detail = $model->getAttributes([
            'id',
            'user_name',
            'nick_name',
            'salt',
            'password_hash',
            'status',
            'add_time',
            'update_time',
            'avatar',
            'role_id',
        ]);


        return $this->jsonSuccess('成功', $detail);
    }

    /**
     * 创建
     * @return mixed
     */
    public function actionCreate()
    {
        // 赋值所需数据
        $data = [
            'user_name' => $this->post('user_name'),
            'nick_name' => $this->post('nick_name'),
            'status' => $this->post('status'),
            'role_id' => $this->post('role_id'),
            'password' => $this->post('password'),
        ];

        // 实例化类
        $model = AdminUserModel::loadModel(null, AdminUserModel::addUser);
        // 加载类数据
        $model->load($data, '');

        // 数据保存失败并返回错误信息
        if (!$model->saveData()) {

            $error = $model->getFirstErrors();
            return $this->jsonFail('添加失败, 请确认各项数据是否合法', 400, [
                'columnError' => CommonModel::chineseErr($error)
            ]);
        }

        // 成功返回
        return $this->jsonSuccess('成功');
    }

    /**
     * 更新
     * @return mixed
     */
    public function actionUpdate()
    {

        // 编号
        $id = $this->post('id');

        // 实例化类 - 并根据编号查询
        $model = AdminUserModel::loadModel($id);
        // 编号非法返回
        if (empty($model)) {

            return $this->jsonFail('数据不存在', 400, [
                'error_hint' => '请传输编号',
                'error_code' => 400
            ]);
        }

        // 赋值所需数据
        $data = [
            'user_name' => $this->post('user_name'),
            'nick_name' => $this->post('nick_name'),
            'status' => $this->post('status'),
            'role_id' => $this->post('role_id'),
        ];

        // 加载类数据
        $model->load($data, '');

        // 数据保存失败并返回错误信息
        if (!$model->saveData()) {

            $error = $model->getFirstErrors();
            return $this->jsonFail('修改失败, 请确认各项数据是否合法', 400, [
                'columnError' => CommonModel::chineseErr($error)
            ]);
        }

        // 成功返回
        return $this->jsonSuccess('成功');
    }

    /**
     * 禁用条目
     * @param array $idList 数据条目|多条数组格式，如：[1,2,3]
     * @return mixed
     */
    public function actionDisabled()
    {

        // 编号列表获取
        $idList = $this->post('idList');
        // 不是数组塑造下 为了构成100%的数组
        if (!empty($idList) && !is_array($idList)) $idList = explode(',', $idList);
        // 看获取的编号列表是否合法
        if (empty($idList) || count($idList) <= 0) {

            return $this->jsonFail('请选择一个条目', 400, [
                'error_hint' => '未传输任何编号',
                'error_code' => 403
            ]);
        }

        // 检测多选条目
        $idMaxCount = empty(\Yii::$app->params['maxIdCount']) ? 100 : \Yii::$app->params['maxIdCount'];
        if (count($idList) > intval($idMaxCount)) {
            return $this->jsonFail('每次最多选择操作' . $idMaxCount . '条数据', 400);
        }

        // 条件
        $condition = ['AND', ['IN', 'id', $idList]];
        // 修改的字段
        $field = ['status' => AdminUserModel::getStatDisabled()];
        // 是否操作成功 - 错误一般记录到[log]日志
        if (!AdminUserModel::updateField($condition, $field)) {

            // 将返回数据库级错误，暂不返回 会在日志中记录
            return $this->jsonFail('请求频繁请稍后尝试', 500, [
                'err_detail' => '出现致命错误。请查看日志',
                'err_code' => 500
            ]);
        }

        return $this->jsonSuccess('成功');
    }

    /**
     * 开启条目
     * @param array $idList 数据条目|多条数组格式，如：[1,2,3]
     * @return mixed
     */
    public function actionOpen()
    {

        // 编号列表获取
        $idList = $this->post('idList');
        // 不是数组塑造下 为了构成100%的数组
        if (!empty($idList) && !is_array($idList)) $idList = explode(',', $idList);
        // 看获取的编号列表是否合法
        if (empty($idList) || count($idList) <= 0) {

            return $this->jsonFail('请选择一个条目', 400, [
                'error_hint' => '未传输任何编号',
                'error_code' => 403
            ]);
        }

        // 检测多选条目
        $idMaxCount = empty(\Yii::$app->params['maxIdCount']) ? 200 : \Yii::$app->params['maxIdCount'];
        if (count($idList) > intval($idMaxCount)) {
            return $this->jsonFail('每次最多选择操作' . $idMaxCount . '条数据', 400);
        }

        // 条件
        $condition = ['AND', ['IN', 'id', $idList]];
        // 修改的字段
        $field = ['status' => AdminUserModel::getStatOpen()];
        // 是否操作成功 - 错误一般记录到[log]日志
        if (!AdminUserModel::updateField($condition, $field)) {

            // 将返回数据库级错误，暂不返回 会在日志中记录
            return $this->jsonFail('请求频繁请稍后尝试', 500, [
                'err_detail' => '出现致命错误。请查看日志',
                'err_code' => 500
            ]);
        }

        return $this->jsonSuccess('成功');
    }

    /**
     * 修改密码
     * @param array $idList 数据条目|多条数组格式，如：[1,2,3]
     * @return mixed
     */
    public function actionChangePassword()
    {

        // 编号列表获取
        $id = $this->post('id');
        // 看获取的编号列表是否合法
        if (empty($id)) {

            return $this->jsonFail('请选择一个条目', 400, [
                'error_hint' => '未传输任何编号',
                'error_code' => 403
            ]);
        }

        // 密码
        $password = $this->post('password');
        if (empty($password)) {
            return $this->jsonFail('请填写密码', 400);
        }

        // 用户
        $userInfo = AdminUserModel::loadModel($id);
        // 用户不存在
        if (empty($userInfo)) {

            return $this->jsonFail('用户不存在', 404);
        }

        $passwordHas = AdminUserModel::getPassCrypt($password, $userInfo['salt']);

        // 条件
        $condition = ['AND', ['=', 'id', $id]];
        // 修改的字段
        $field = ['password_hash' => $passwordHas];
        // 是否操作成功 - 错误一般记录到[log]日志
        if (!AdminUserModel::updateField($condition, $field)) {

            // 将返回数据库级错误，暂不返回 会在日志中记录
            return $this->jsonFail('请求频繁请稍后尝试', 500, [
                'err_detail' => '出现致命错误。请查看日志',
                'err_code' => 500
            ]);
        }

        return $this->jsonSuccess('成功');
    }
}
